package com.librelato.tela;

import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.librelato.bean.EmpresaBean;
import com.librelato.bean.PedidoBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.negocio.PedidoServico;
import com.librelato.negocio.interfaces.IServicoGenerico;

@ManagedBean
@ViewScoped
public class ListaPedidoTela extends TelaAbstrata {

	@ManagedProperty(value = "#{usuario}")
	private UsuarioBean usuario;

	private List<PedidoBean> listaPedidos;

	private PedidoServico<PedidoBean> servico;

	private EmpresaBean empresaSelecionada;

	private String dataDe;

	private String dataAte;

	private String numPedido;

	private String status;

	private SimpleDateFormat df;

	private PedidoBean pedido;
	

	public ListaPedidoTela() {
		usuario = usuario == null ? (UsuarioBean) ((HttpSession) FacesContext
				.getCurrentInstance().getExternalContext().getSession(false))
				.getAttribute("usuario") : usuario;
		servico = new PedidoServico<PedidoBean>();
		empresaSelecionada = usuario.getFilial();
		df = new SimpleDateFormat("dd/MM/yy");
		dataAte = df.format(new Date());
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.add(Calendar.DATE, -30);
		dataDe = df.format(calendar.getTime());
		try {
			listaPedidos = this.servico.buscaPedidos("", "", "", "", "",
					usuario.getMatricula(), false);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String pintaLinha(PedidoBean pedido) {
		String classe = "";
		int bloq = 0;
		int apro = 0;
		int comp = 0;
		for (int i = 0; i < pedido.getListaProdutos().size(); i++) {
			if (pedido.getListaProdutos().get(i).getQtdeAtendida()
					.doubleValue() == 0) {
				bloq++;
			} else if (pedido.getListaProdutos().get(i).getQtdeAtendida()
					.doubleValue() != 0
					&& pedido.getListaProdutos().get(i).getQtdeAtendida()
							.doubleValue() < pedido.getListaProdutos().get(i)
							.getQuantidade().doubleValue()) {
				apro++;
			} else if (pedido.getListaProdutos().get(i).getQtdeAtendida()
					.doubleValue() == pedido.getListaProdutos().get(i)
					.getQuantidade().doubleValue()) {
				comp++;
			}
		}
		if(comp == 0 && apro == 0) {
			classe = "LinhaBloq";
		}
		else if(bloq == 0 && apro == 0) {
			classe = "LinhaComp";
		}
		else {
			classe = "LinhaApro";
		}
		return classe;
	}

	public void atualizaDataVisu(PedidoBean pedido) {
		if (pedido.getDtVisualizado() == null) {
			pedido.setDtVisualizado(new Date());
			try {
				this.servico.atualizaDtVisu(pedido);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public String converteData(Date data) {
		String dataAux = "-";
		if (data != null) {
			dataAux = df.format(data);
		}
		return dataAux;
	}

	public String calculaTotal(PedidoBean pedido) {
		double total = 0;
		for (int i = 0; i < listaPedidos.size(); i++) {
			if (listaPedidos.get(i).getNumeroPedido()
					.equals(pedido.getNumeroPedido())) {
				for (int j = 0; j < listaPedidos.get(i).getListaProdutos()
						.size(); j++) {
					total += listaPedidos.get(i).getListaProdutos().get(j)
							.getVlTotal();
				}
				break;
			}
		}
		return total + "";
	}

	public String calculaTotalIpi(PedidoBean pedido) {
		double total = 0;
		for (int i = 0; i < listaPedidos.size(); i++) {
			if (listaPedidos.get(i).getNumeroPedido()
					.equals(pedido.getNumeroPedido())) {
				for (int j = 0; j < listaPedidos.get(i).getListaProdutos()
						.size(); j++) {
					total += listaPedidos.get(i).getListaProdutos().get(j)
							.getVlTotal()
							* (listaPedidos.get(i).getListaProdutos().get(j)
									.getIpi() / 100);
				}
				break;
			}
		}
		return total + "";
	}

	public void imprime() {
		try {
			byte[] b = this.servico.imprime(pedido,usuario.getCodigo());
			FacesContext facesContext = FacesContext.getCurrentInstance();
			ExternalContext externalContext = facesContext.getExternalContext();
			HttpServletResponse response = (HttpServletResponse) externalContext
					.getResponse();
			response.reset(); 
			response.setContentType("application/pdf"); 
			response.setHeader("Content-disposition",
					"attachment; filename=\"Pedido\"");
			OutputStream output = response.getOutputStream();
			output.write(b);
			output.close();
			facesContext.responseComplete(); 
			atualizaDataVisu(pedido);
			pedido = new PedidoBean();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void filtraPedido() {
		String dataDe = this.dataDe;
		String dataAte = this.dataAte;
		String numSolicita = (numPedido == null || "".equals(numPedido.trim())) ? ""
				: numPedido;
		String status = this.status;
		String filial = this.empresaSelecionada.getFilial();
		String codFornecedor = usuario.getMatricula();
		boolean filtro = true;
		pedido = new PedidoBean();
		try {
			listaPedidos = this.servico.buscaPedidos(dataDe, dataAte,
					numSolicita, status, filial, codFornecedor, filtro);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("rawtypes")
	@Override
	protected IServicoGenerico getServico() {
		return this.servico;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public EmpresaBean getEmpresaSelecionada() {
		return empresaSelecionada;
	}

	public void setEmpresaSelecionada(EmpresaBean empresaSelecionada) {
		this.empresaSelecionada = empresaSelecionada;
	}

	public String getDataDe() {
		return dataDe;
	}

	public void setDataDe(String dataDe) {
		this.dataDe = dataDe;
	}

	public String getDataAte() {
		return dataAte;
	}

	public void setDataAte(String dataAte) {
		this.dataAte = dataAte;
	}

	public String getNumPedido() {
		return numPedido;
	}

	public void setNumPedido(String numPedido) {
		this.numPedido = numPedido;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public SimpleDateFormat getDf() {
		return df;
	}

	public void setDf(SimpleDateFormat df) {
		this.df = df;
	}

	public List<PedidoBean> getListaPedidos() {
		return listaPedidos;
	}

	public void setListaPedidos(List<PedidoBean> listaPedidos) {
		this.listaPedidos = listaPedidos;
	}

	public PedidoBean getPedido() {
		return pedido;
	}

	public void setPedido(PedidoBean pedido) {
		this.pedido = pedido;
	}

	public void setServico(PedidoServico<PedidoBean> servico) {
		this.servico = servico;
	}

	
}
